﻿请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。

数字 1 - 9 在每一行只能出现一次。
数字 1 - 9 在每一列只能出现一次。
数字 1 - 9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。（请参考示例图）

bool isValidSudoku(char** board, int boardSize, int* boardColSize){
	//设置一个三维的数组，三维数组不管是怎样是什么样子的，就好像房子的编号281，291，304一样，只是一个存储数字的空间，我们将九宫格的数字不断的放入到九宫格中（其实是重复的放置三次），比如题目里面的0，0数字5一样，在数组的存储中就相当与放在005这个房间中，因为房间不为空所以点亮一个标记，也就是当前房间内不空，也即是后面　＝＝　1的来源,为什么将第一位设置为三呢，应为这个数组有三个条件，行，列，块，也就相当于房间建立在三个地方，我们要对比什么就去相对应的地方找到相对应的房间，然后查看我们的房间是不是空的。（题目本身说哈希表，是说一种概念，哈希表不会存储相同的信息，其实也是这样的原理）。
	int arr[3][9][9] = { 0 };
	//int[][] row = new int[9][9];
	//int[][] line = new int[9][9];
	//int[][] box = new int[9][9];
	int block, i, j, num;
	for (i = 0; i < 9; i++){
		for (j = 0; j < 9; j++){
			if (board[i][j] == '.')
				continue;
			else{
				/*为了匹配数组坐标为0-8，数独里的字符为1-9，此处-1*/
				//从输入的表看出输入的不是数字，而是字符，所以在这里使用字符做减法，来达到限制房间最后一位号码的目的；
				num = (int)(board[i][j] - 49);//等价num =(int)(board[i][j]-'1')
				/*判断是在哪儿一块*/
				block = i / 3 * 3 + j / 3;//每个小的九宫格的编号
				/*判断在这个编号的房间是不是空的，0，表示0地方，1表示1地方，2表示2地方，其他的部分就是地方下房间的后两位*/
				if (arr[0][i][num] == 1 \
					|| arr[1][j][num] == 1 \
					|| arr[2][block][num] == 1)
					return false;

				/*这里就是将来的数字放入房间并开启标记*/
				arr[0][i][num] = 1;
				arr[1][j][num] = 1;
				arr[2][block][num] = 1;
			}
		}
	}
	return true;
}
